2
תגובות

has_many_and_belongs_to with belongs_to

פתח ldbrgr ,
יש לי שלוש תבלאות שאני צריך לקשר בניהם:

הראשונה היא uploads, שהיא נראת ככה:
----------------------------
ID | uploader_ID | filename
----------------------------

השניה uploads_reports
----------------------------
ID | report_ID | upload_id
----------------------------

והשלישית users
----------------------------
ID | username
----------------------------

uploads ו uploads_reports מקושרות כ has_many_and_belongs_to
ו uploads ו users מקושרות כ uploads belongs_to users על המפתח uploader_ID

בכל מקרה,
ככה השאילתה לשלוף את כל הקבצים המדוווחים נראת:
SELECT
  `uploads`.*
FROM
  `uploads_reports`
JOIN
  `uploads`
ON
  `uploads`.`id` = `uploads_reports`.`upload_id`
GROUP BY
  `uploads`.`id`


השאילתה שאני מנסה לכתוב היא כזאת:
שלוף את כל המשתמשים שיש להם קבצים מדווחים, סדר לפי מספר קבצים מדווחים.
נגיד למשתמש 1 יש 4 קבצים מדווחים, למשתמש 3 יש 5 קבצים מדווחים ולמשתמש 6 יש שלוש קבצים מדווחים זה יראה ככה:
----------------------------
ID | username | uploads_reports_count
----------------------------
3 | test3 | 5
----------------------------
1 | test1 | 4
----------------------------
6 | test6 | 3
----------------------------

או בקיצור אני צריך לשלוף את כל המשתמש שהקבצים שלהם מדווחים ולסדר אותם לפני מספר קבצים מדווחים.
אני יודע לעשות את זה בשתי שאילתות, אבל אני בטוח שאפשר לעשות את זה בשאילתא אחת ולשם אני שואף..

יש רעיונות?

2 תשובות

avatar ענה intval ב 06 לינואר 2013 #

SELECT  users.id, users.username,
  COUNT(uploads_reports.id) AS count1
FROM
  users

LEFT JOIN uploads
  ON users.id = uploads.uploader_ID

LEFT JOIN uploads_reports
  ON uploads.id = uploads_reports.upload_id

GROUP BY uploads.uploader_id
ORDER BY count1 DESC


יהיה לך יותר פשוט להוסיף עמודה של report_count לכל יוזר ולעדכן אותה כל פעם שיש ריפורט חדש על קובץ של אותו יוזר.

avatar ענה ldbrgr ב 06 לינואר 2013 #

תודה, לא ביקשתי שאליתא - ביקשתי רעיונות XD (לא ידעתי שאפשר לעשות 2 join בשאילתא אחת..)
זה רק בשביל פאנל ניהול, אז אין כ"כ צורך בreport_count כמו שציינת.
שוב תודה :D